package compresionLZP;

import java.util.Arrays;

import com.colloquial.arithcode2.ConversionesTiposDatos;

public class RegistroLZP {
	
	private int posicion;
	private byte[] contexto;
	private byte[] salida;
	public static final short ESC = (short)65534;
	
	public RegistroLZP(){
		posicion = 0;
		contexto = new byte[4];
		salida = new byte[6];
	}
	
	public byte[] getContexto() {
		return contexto;
	}
	public void setContexto(byte[] contexto) {
		this.contexto = contexto;
	}
	
	public int getPosicion() {
		return posicion;
	}
	public void setPosicion(int posicion) {
		this.posicion = posicion;
	}
	public byte[] getSalida() {
		return salida;
	}
	public void setSalida(byte[] salida) {
		this.salida = salida;
	}

	public boolean compararContexto(byte[] contexto) {
		if (this.contexto == null)
			return false;
		if ((contexto[0]==this.contexto[0])&&
		(contexto[1]==this.contexto[1])&&
		(contexto[2]==this.contexto[2])&&
		(contexto[3]==this.contexto[3]))
			return true;
		return false;
	}
	
	public String toString(){
		
		
		short contexto1=0;
		short contexto2=0;
		if (this.contexto!=null){
			contexto1= ConversionesTiposDatos.BytesToShort(Arrays.copyOfRange(this.contexto, 0, 2));
			contexto2= ConversionesTiposDatos.BytesToShort(Arrays.copyOfRange(this.contexto, 2, 4));
		}
		
		short salidaLong = ConversionesTiposDatos.BytesToShort(Arrays.copyOfRange(salida, 0, 2)); 
		short salidaCtx = ConversionesTiposDatos.BytesToShort(Arrays.copyOfRange(salida, 2, 4));
		short salidaChar = ConversionesTiposDatos.BytesToShort(Arrays.copyOfRange(salida, 4, 6));
		
		return "Posicion: "+this.getPosicion()+" \t Contexto: "+contexto1+" "+contexto2+
				"\t SLong: "+salidaLong+"\t SCtx: "+salidaCtx+"\t SChar: "+salidaChar+"\n";
	}
	
	public byte[] toBytes(){
		byte[] byteArray = new byte[14];
		byte[] byteInt = ConversionesTiposDatos.convertirIntABytes(this.getPosicion());
		byteArray[0] = byteInt[0];
		byteArray[1] = byteInt[1];
		byteArray[2] = byteInt[2];
		byteArray[3] = byteInt[3];
		if (this.contexto==null){
			byteArray[4] = ConversionesTiposDatos.ShortToBytes((short)0)[0];
			byteArray[5] = ConversionesTiposDatos.ShortToBytes((short)0)[0];
			byteArray[6] = ConversionesTiposDatos.ShortToBytes((short)0)[0];
			byteArray[7] = ConversionesTiposDatos.ShortToBytes((short)0)[0];
		} else {
			byteArray[4] = this.getContexto()[0];
			byteArray[5] = this.getContexto()[1];
			byteArray[6] = this.getContexto()[2];
			byteArray[7] = this.getContexto()[3];			
		}
		byteArray[8] = this.getSalida()[0];
		byteArray[9] = this.getSalida()[1];
		byteArray[10] = this.getSalida()[2];
		byteArray[11] = this.getSalida()[3];
		byteArray[12] = this.getSalida()[4];
		byteArray[13] = this.getSalida()[5];
		return byteArray;		
	}

	public void toRegister(byte[] byteArray){
		this.setPosicion(ConversionesTiposDatos.convertirBytesAInt(Arrays.copyOfRange(byteArray, 0, 4)));
		
		if (byteArray[4] == ConversionesTiposDatos.ShortToBytes((short)0)[0]&&
			byteArray[5] == ConversionesTiposDatos.ShortToBytes((short)0)[0]&&
			byteArray[6] == ConversionesTiposDatos.ShortToBytes((short)0)[0]&&
			byteArray[7] == ConversionesTiposDatos.ShortToBytes((short)0)[0]&&
			this.getPosicion()<3) {
			
			this.setContexto(null);
		}
		else
			this.setContexto(Arrays.copyOfRange(byteArray, 4, 8));		
		
		this.setSalida(Arrays.copyOfRange(byteArray, 8, 14));
				
	}

}
